package com.ffcc.fitness.gym.service;

import com.ffcc.fitness.gym.pojo.dto.GymClaimParam;
import com.ffcc.fitness.gym.pojo.dto.GymSaveParam;
import com.ffcc.fitness.gym.pojo.dto.POIGymParam;
import com.ffcc.fitness.gym.pojo.entity.Gym;
import com.ffcc.fitness.gym.pojo.vo.GymInfo;

import java.util.List;

public interface GymService {
    /**
     * 场馆认领
     * @param gymClaimParam 认领参数
     */
    void claimGym(GymClaimParam gymClaimParam);
      /**
     * 发送验证码
     * @param email 邮箱地址
     * @return 发送结果
     */
    boolean sendVerificationCode(String email);
    
    /**
     * 验证邮箱验证码
     * @param email 邮箱地址
     * @param code 验证码
     * @return 验证结果
     */
    boolean verifyEmailCode(String email, String code);
    
    /**
     * 获取用户邮箱
     * @param userId 用户ID
     * @return 用户邮箱
     */
    String getUserEmail(Long userId);
    
    /**
     * 根据用户ID获取场馆信息
     * @param userId 用户ID
     * @return 场馆信息
     */
    GymInfo getGymByUserId(Long userId);
    
    /**
     * 根据用户ID获取已认领的场馆信息
     * @param userId 用户ID
     * @return 认领的场馆信息
     */
    GymInfo getClaimedGymByUserId(Long userId);
    
    /**
     * 创建场馆
     */
    void insert(GymSaveParam gymSaveParam);
    
    /**
     * 更新场馆信息
     */
    void updateGym(Gym gym);
    
    /**
     * 根据用户名查询场馆信息
     * @param username 用户名
     * @return 场馆信息
     */
    GymInfo selectByUsername(String username);
      /**
     * 检查场馆是否可认领
     * @param gymIdOrPoiId 场馆ID或POI ID
     * @return 是否可认领
     */
    boolean isClaimable(String gymIdOrPoiId);
    
    /**
     * 批量存储POI场馆数据
     * @param poiGyms POI场馆列表
     * @return 成功存储的数量
     */
    int savePOIGyms(List<POIGymParam> poiGyms);
    
    /**
     * 获取未认领的POI场馆列表
     * @return 未认领场馆列表
     */
    List<GymInfo> getUnclaimedPOIGyms();
    
    /**
     * 获取所有POI场馆列表（包括已认领和未认领）
     * @return 所有POI场馆列表
     */
    List<GymInfo> getAllPOIGyms();
    
    /**
     * 根据区域获取场馆列表
     * @param area 区域名称
     * @return 场馆列表
     */
    List<GymInfo> getGymsByArea(String area);
      /**
     * 根据坐标范围获取附近场馆
     * @param centerLng 中心经度
     * @param centerLat 中心纬度
     * @param radius 搜索半径（公里）
     * @return 附近场馆列表
     */
    List<GymInfo> getNearbyGyms(Double centerLng, Double centerLat, Double radius);
    
    /**
     * 更新场馆状态
     * @param gymId 场馆ID
     * @param userId 用户ID
     * @param status 新状态
     */
    void updateGymStatus(Long gymId, Long userId, String status);
}
